本文转自公众号 Pimow博客,在此谢谢指导
一文带你吃透线程池
1 | 微信公众号:[Amos博客] |
TreadPoolexecutor源码解析
类关系图
1 | (I)Executor |
Executor接口
Executor提供execute()用来启动任务1
2
3
4public interface Executor {
//用来启动任务
void execute(Runnable command);
}
ExecutorService接口
ExecutorService提供了一些管理线程池方法和任务执行的方法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33public interface ExecutorService extends Executor {
//关闭线程池,队列已经存在的任务可以继续执行
void shutdown();
//关闭线程池,中断未执行的任务
List<Runnable> shutdownNow();
//判断是否关闭
boolean isShutdown();
//判断是否终止
boolean isTerminated();
//设置超时终止
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
//提交Callable任务
<T> Future<T> submit(Callable<T> task);
//提交Runable任务,带返回值
<T> Future<T> submit(Runnable task, T result);
//提交Runnable任务不带返回值
Future<?> submit(Runnable task);
//invokeAll()是同步的,其需要等待任务的完成,才能返回。submit()是异步的
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException;
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException;
//invokeAny()取第一个任务的返回值,然后调用interrupt方法中断其它任务。
<T> T invokeAny(Collection<? extends Callable<T>> tasks)
throws InterruptedException, ExecutionException;
<T> T invokeAny(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
AbstractExecutorService
AbstractExecutorService类重写某些方法。自定义了newTaskFor()用于构建RunnableFuture。
成员变量
1 | /** |
构造函数
1 | //直接提供了一个最终调用的构造函数 |
Worker类解析
Worker简介
Woeker类是ThreadPoolExecutor一个内部类。此类继AbstractQueuedSynchronizer,
目的在于判断线程是否空闲以及是否可以被中断。实现Runnable,在run()中调用了runWorker()。
Worker类中firstTask用来保存传入的任务,thread是在调用构造方法时通过ThreadFactory来创建的线程,是用来处理任务的线程。注意:这个线程并不是task线程。
成员变量
1 | /** 工作线程空间,由线程池中所设置的线程工厂创建*/ |
构造方法
1 | Worker(Runnable firstTask) { |
execute()解析
1 | public void execute(Runnable command) { |
addWorker()解析
1 | /** |
runWorker()解析
1 | final void runWorker(Worker w) { |
getTask()解析
1 | //什么情况才会执行getTask呢?说明工作线程数已经大于核心线程数才会执行getTask()。一定要记住这一点 |
processWorkerExit()解析
1 | private void processWorkerExit(Worker w, boolean completedAbruptly) { |
tryTerminate()解析
1 | //根据线程池状态判断是否结束线程池 |
interruptIdleWorker()解析
1 | //该方法用于给空闲工作线程一个中断标识 |
监控线程池
通过线程池提供的参数进行监控
- getTaskCount:线程池任务总数。
- getCompletedTaskCount:线程池已完成的任务数量,小于等于completedTaskCount。
- getPoolSize:线程池当前的核心线程数量。
- getLargestPoolSize:线程池曾经创建过的最大线程数量。
- getActiveCount:当前线程池中正在执行任务的线程数量。